home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 25
/
Aminet 25 (1998)(GTI - Schatztruhe)[!][Jun 1998].iso
/
Aminet
/
game
/
shoot
/
ADoom_src_1_2.lha
/
ADoom_src
/
dehacked.c
< prev
next >
Wrap
C/C++ Source or Header
|
1998-03-09
|
19KB
|
728 lines
// Emacs style mode select -*- C++ -*-
//-----------------------------------------------------------------------------
//
// $Id:$
//
// Cyril Deble 1998 (cyril.deble@inforoute.cgs.fr)
//
// This source is available for distribution and/or modification
// only under the terms of the DOOM Source Code License as
// published by id Software. All rights reserved.
//
// The source is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// FITNESS FOR A PARTICULAR PURPOSE. See the DOOM Source Code License
// for more details.
//
// DESCRIPTION:
// Doom internal dehacked file loader for amiga only :)
// 0.1 (11/02/98) First internal release
// 0.2 (15/02/98) Currently only a few options supported
// 0.3 (08/03/98) Added much more (almost all) options support
// and corrected some pointless bugs
//
//-----------------------------------------------------------------------------
static const char
rcsid[] = "$Id: dehacked.c,v 0.3 1998/03/08 23:05:00 b1 Exp $";
#include <ctype.h>
#include <stdlib.h>
// Data.
#include "doomdef.h"
#include "sounds.h"
#include "m_fixed.h"
#include "doomstat.h"
#include "info.h"
#include "m_cheat.h"
#ifdef __GNUG__
#pragma implementation "info.h"
#endif
#include "info.h"
#include "p_mobj.h"
/* for ammo */
extern int clipammo[];
/* for misc */
extern int idfa_armor;
extern int idfa_armor_class;
extern int idkfa_armor;
extern int idkfa_armor_class;
extern int god_health;
extern int initial_health;
extern int initial_bullets;
extern int MAXHEALTH;
extern int max_armor;
extern int green_armor_class;
extern int blue_armor_class;
extern int maxsoul;
extern int soul_health;
extern int mega_health;
extern int BFGCELLS;
/* for cheat */
extern char cheat_mus_seq[];
extern char cheat_choppers_seq[];
extern char cheat_god_seq[];
extern char cheat_ammo_seq[];
extern char cheat_ammonokey_seq[];
extern char cheat_noclip_seq[];
extern char cheat_commercial_noclip_seq[];
extern char cheat_powerup_seq[7][10];
extern char cheat_clev_seq[];
extern char cheat_mypos_seq[];
extern char cheat_amap_seq[];
enum
{
THING_ID = 0,
THING_HIT_POINTS,
THING_SPEED,
THING_WIDTH,
THING_HEIGHT,
THING_MISSILE_DAMAGE,
THING_REACTION_TIME,
THING_PAIN_CHANCE,
THING_MASS,
THING_BITS,
THING_ALERT_SOUND,
THING_ATTACK_SOUND,
THING_PAIN_SOUND,
THING_DEATH_SOUND,
THING_ACTION_SOUND,
THING_INITIAL_FRAME,
THING_FIRST_MOVING_FRAME,
THING_INJURY_FRAME,
THING_CLOSE_ATTACK_FRAME,
THING_FAR_ATTACK_FRAME,
THING_DEATH_FRAME,
THING_EXPLODING_FRAME,
THING_RESPAWN_FRAME,
FRAME_SPRITE_NUMBER,
FRAME_SPRITE_SUBNUMBER,
FRAME_DURATION,
FRAME_NEXT_FRAME,
FRAME_UNKNOWN_1,
FRAME_UNKNOWN_2,
SPRITE_OFFSET,
AMMO_MAX_AMMO,
AMMO_PER_AMMO,
WEAPON_AMMO_TYPE,
WEAPON_DESELECT_FRAME,
WEAPON_SELECT_FRAME,
WEAPON_BOBBING_FRAME,
WEAPON_SHOOTING_FRAME,
WEAPON_FIRING_FRAME,
POINTER_CODEP_FRAME,
CHEAT_CHANGE_MUSIC,
CHEAT_CHAINSAW,
CHEAT_GOD_MODE,
CHEAT_AMMO_KEYS,
CHEAT_AMMO,
CHEAT_NO_CLIPPING_1,
CHEAT_NO_CLIPPING_2,
CHEAT_INVINCIBILITY,
CHEAT_BERSERK,
CHEAT_INVISIBILITY,
CHEAT_RADIATION_SUIT,
CHEAT_AUTO_MAP,
CHEAT_LITE_AMP_GOGGLES,
CHEAT_BEHOLD_MENU,
CHEAT_LEVEL_WARP,
CHEAT_PLAYER_POSITION,
CHEAT_MAP_CHEAT,
MISC_INITIAL_HEALTH,
MISC_INITIAL_BULLETS,
MISC_MAX_HEALTH,
MISC_MAX_ARMOR,
MISC_GREEN_ARMOR_CLASS,
MISC_BLUE_ARMOR_CLASS,
MISC_MAX_SOULSPHERE,
MISC_SOULSPHERE_HEALTH,
MISC_MEGASPHERE_HEALTH,
MISC_GOD_MODE_HEALTH,
MISC_IDFA_ARMOR,
MISC_IDFA_ARMOR_CLASS,
MISC_IDKFA_ARMOR,
MISC_IDKFA_ARMOR_CLASS,
MISC_BFG_CELLS_SHOT,
MISC_MONSTERS_INFIGHT,
NUM_KEYWORD
};
/* All keywords supported */
char *Keywords[] = {
/* Things */
"id # = ", /* mobjinfo.doomednum */
"hit points = ", /* mobjinfo.spawnhealth */
"speed = ", /* mobjinfo.speed */
"width = ", /* mobjinfo.radius */
"height = ", /* mobjinfo.height */
"missile damage = ", /* mobjinfo.damage */
"reaction time = ", /* mobjinfo.reactiontime */
"pain chance = ", /* mobjinfo.painchance */
"mass = ", /* mobjinfo.mass */
"bits = ", /* mobjinfo.flags */
"alert sound = ", /* mobjinfo.seesound */
"attack sound = ", /* mobjinfo.attacksound */
"pain sound = ", /* mobjinfo.painsound */
"death sound = ", /* mobjinfo.deathsound */
"action sound = ", /* mobjinfo.activesound */
"initial frame = ", /* mobjinfo.spawnstate */
"first moving frame = ", /* mobjinfo.seestate */
"injury frame = ", /* mobjinfo.painstate */
"close attack frame = ", /* mobjinfo.meleestate */
"far attack frame = ", /* mobjinfo.missilestate */
"death frame = ", /* mobjinfo.deathstate */
"exploding frame = ", /* mobjinfo.xdeathstate */
"respawn frame = ", /* mobjinfo.raisestate */
/* Frame */
"sprite number = ", /* states.sprite */
"sprite subnumber = ", /* states.frame */
"duration = ", /* states.tics */
"next frame = ", /* states.nextstate */
"unknown 1 = ", /* states.misc1 */
"unknown 2 = ", /* states.misc2 */
/* Sprite */
"offset =", /* supported */
/* Ammo */
"max ammo = ", /* maxammo */
"per ammo = ", /* clipammo */
/* Weapon */
"ammo type = ", /* weaponinfo.ammo */
"deselect frame = ", /* weaponinfo.upstate */
"select frame = ", /* weaponinfo.downstate */
"bobbing frame = ", /* weaponinfo.readystate */
"shooting frame = ", /* weaponinfo.atkstate */
"firing frame = ", /* weaponinfo.flashstate */
/* Pointer */
"codep frame = ", /* supported */
/* Cheat */
"change music = ", /* supported */
"chainsaw = ", /* supported */
"god mode = ", /* supported */
"ammo & keys = ", /* supported */
"ammo = ", /* supported */
"no clipping 1 = ", /* supported */
"no clipping 2 = ", /* supported */
"invincibility = ", /* supported */
"berserk = ", /* supported */
"invisibility = ", /* supported */
"radiation suit = ", /* supported */
"auto-map = ", /* supported */
"lite-amp goggles = ", /* supported */
"behold menu = ", /* supported */
"level warp = ", /* supported */
"player position = ", /* supported */
"map cheat = ", /* supported */
/* Misc */
"initial health = ", /* initial_health */
"initial bullets = ", /* initial_bullets */
"max health = ", /* maxhealth */
"max armor = ", /* max_armor */
"green armor class = ", /* green_armor_class */
"blue armor class = ", /* blue_armor_class */
"max soulsphere = ", /* maxsoul */
"soulsphere health = ", /* soul_health */
"megasphere health = ", /* mega_health */
"god mode health = ", /* god_health */
"idfa armor = ", /* idfa_armor */
"idfa armor class = ", /* idfa_armor_class */
"idkfa armor = ", /* idkfa_armor */
"idkfa armor class = ", /* idfa_armor_class */
"bfg cells/shot = ", /* bfgcells */
"monsters infight = ", /* not supported */
/* Others to follow :) */
"\n" /* The last */
};
/* Backup of action pointer */
actionf_t actions[NUMSTATES];
/* Backup of sprites names */
char * oldsprnames[NUMSPRITES];
void DE_Cheat(char *cheatseq, char* newcheat)
{
unsigned char *i,*j;
for(i=newcheat;*i!='\0';i++)
*i=SCRAMBLE(*i);
for(i=cheatseq,j=newcheat;*j!='\0' && *j!=0xff;i++,j++)
if(*i==1 || *i==0xff) // no more place in the cheat
return;
else
*i=*j;
j=i;
for(;*i!=0xff;i++)
if(*i==1)
{
*j++=1;
*j++=0;
*j++=0;
break;
}
*j=0xff;
return;
}
void DE_Text(FILE* f,int len1,int len2)
{
char s[50];
int i;
// it is hard to change all the text in doom
// here i implement only vital things
// yes text change somes tables like music, sound and sprite name
if(len1>6)
return;
if(fread(s,len1+len2,1,f))
{
for(i=0;i<108;i++)
if(!strncmp(S_sfx[i].name,s,len1))
{
strncpy(S_sfx[i].name,&(s[len1]),len2);
return;
}
for(i=0;i<NUMSPRITES;i++)
if(!strncmp(sprnames[i],s,len1))
{
strncpy(sprnames[i],&(s[len1]),len2);
return;
}
for(i=0;i<NUMSPRITES;i++)
if(!strncmp(sprnames[i],s,len1))
{
strncpy(sprnames[i],&(s[len1]),len2);
return;
}
for(i=1;i<68;i++)
if(!strncmp(S_music[i].name,s,len1))
{
strncpy(S_music[i].name,&(s[len1]),len2);
return;
}
/* more text to follow */
}
}
int
DE_Search(char *arg, char **list)
{
int i, l;
/* Make into lower case, and get length of string */
for (l = 0; *(arg + l); l++)
*(arg + l) = tolower(*(arg + l));
/*printf("arg = '%s'\n", arg);*/
for (i = 0; **(list + i) != '\n'; i++) {
/*printf("arg = '%s' list = '%s'\n", arg, *(list + i));*/
if (strstr(arg,*(list + i)))
return(i);
}
return(-1);
}
int
DE_Hack( char * line)
{
static int thing = 0;
static int frame = 0;
static int ammo = 0;
static int weapon = 0;
static int sprite = 0;
static int pointer = 0;
int choice;
char * arg;
/* scanf variables */
int n1;
char buf1[255];
/* first check for main keywords */
if(sscanf(line, "Thing %d (%s)", &n1, buf1) == 2)
{
thing = n1-1;
//buf1[strlen(buf1)-1] = '\0';
//printf("-> Changing Thing %d (%s)\n", n1, buf1);
return(1);
}
if(thing >= NUMMOBJTYPES) return(0);
if(sscanf(line, "Frame %d", &n1) == 1)
{
frame = n1;
//printf("-> Changing Frame %d\n", n1);
return(1);
}
if(frame >= NUMSTATES) return(0);
if(sscanf(line, "Pointer %d", &n1) == 1)
{
pointer = n1;
//printf("-> Changing Pointer %d\n", n1);
return(1);
}
if(pointer >= NUMSTATES) return(0);
if(sscanf(line, "Ammo %d", &n1) == 1)
{
ammo = n1;
//printf("-> Changing Ammo %d\n", n1);
return(1);
}
if(ammo >= NUMAMMO) return(0);
if(sscanf(line, "Cheat %d", &n1) == 1)
{
//printf("-> Changing Cheat\n");
return(1);
}
if(sscanf(line, "Weapon %d", &n1) == 1)
{
weapon = n1;
//printf("-> Changing Weapon %d\n", n1);
return(1);
}
if(weapon >= NUMWEAPONS) return(0);
if(sscanf(line, "Sprite %d", &n1) == 1)
{
sprite = n1;
//printf("-> Changing Sprite %d\n", n1);
return(1);
}
if(sprite >= NUMSPRITES) return(0);
if(sscanf(line, "Misc %d", &n1) == 1)
{
//printf("-> Changing Misc\n");
return(1);
}
/* search for option */
choice = DE_Search(line, Keywords);
if(choice < 0 || choice > NUM_KEYWORD-1) return(0);
arg = strstr(line, Keywords[choice]) +
strlen(Keywords[choice]);
/*printf("Choice = %d, Arg = %s\n", choice, arg);*/
switch(choice)
{
case THING_ID:
mobjinfo[thing].doomednum = atoi(arg);
break;
case THING_HIT_POINTS:
mobjinfo[thing].spawnhealth = atoi(arg);
break;
case THING_SPEED:
mobjinfo[thing].speed = atoi(arg);
break;
case THING_WIDTH:
mobjinfo[thing].radius = atoi(arg);
break;
case THING_HEIGHT:
mobjinfo[thing].height = atoi(arg);
break;
case THING_MISSILE_DAMAGE:
mobjinfo[thing].damage = atoi(arg);
break;
case THING_REACTION_TIME:
mobjinfo[thing].reactiontime = atoi(arg);
break;
case THING_PAIN_CHANCE:
mobjinfo[thing].painchance = atoi(arg);
break;
case THING_MASS:
mobjinfo[thing].mass = atoi(arg);
break;
case THING_BITS:
mobjinfo[thing].flags = atoi(arg);
break;
case THING_ALERT_SOUND:
mobjinfo[thing].seesound = atoi(arg);
break;
case THING_ATTACK_SOUND:
mobjinfo[thing].attacksound = atoi(arg);
break;
case THING_PAIN_SOUND:
mobjinfo[thing].painsound = atoi(arg);
break;
case THING_DEATH_SOUND:
mobjinfo[thing].deathsound = atoi(arg);
break;
case THING_ACTION_SOUND:
mobjinfo[thing].activesound = atoi(arg);
break;
case THING_INITIAL_FRAME:
mobjinfo[thing].spawnstate = atoi(arg);
break;
case THING_FIRST_MOVING_FRAME:
mobjinfo[thing].seestate = atoi(arg);
break;
case THING_INJURY_FRAME:
mobjinfo[thing].painstate = atoi(arg);
break;
case THING_CLOSE_ATTACK_FRAME:
mobjinfo[thing].meleestate = atoi(arg);
break;
case THING_FAR_ATTACK_FRAME:
mobjinfo[thing].missilestate = atoi(arg);
break;
case THING_DEATH_FRAME:
mobjinfo[thing].deathstate = atoi(arg);
break;
case THING_EXPLODING_FRAME:
mobjinfo[thing].xdeathstate = atoi(arg);
break;
case THING_RESPAWN_FRAME:
mobjinfo[thing].raisestate = atoi(arg);
break;
case FRAME_SPRITE_NUMBER:
states[frame].sprite = atoi(arg);
break;
case FRAME_SPRITE_SUBNUMBER:
states[frame].frame = atoi(arg);
break;
case FRAME_DURATION:
states[frame].tics = atoi(arg);
break;
case FRAME_NEXT_FRAME:
states[frame].nextstate = atoi(arg);
break;
case FRAME_UNKNOWN_1:
states[frame].misc1 = atoi(arg);
break;
case FRAME_UNKNOWN_2:
states[frame].misc2 = atoi(arg);
break;
case WEAPON_AMMO_TYPE:
weaponinfo[weapon].ammo = atoi(arg);
break;
case WEAPON_DESELECT_FRAME:
weaponinfo[weapon].upstate = atoi(arg);
break;
case WEAPON_SELECT_FRAME:
weaponinfo[weapon].downstate = atoi(arg);
break;
case WEAPON_BOBBING_FRAME:
weaponinfo[weapon].readystate = atoi(arg);
break;
case WEAPON_SHOOTING_FRAME:
weaponinfo[weapon].atkstate = atoi(arg);
break;
case WEAPON_FIRING_FRAME:
weaponinfo[weapon].flashstate = atoi(arg);
break;
case AMMO_MAX_AMMO:
maxammo[ammo] = atoi(arg);
break;
case AMMO_PER_AMMO:
clipammo[ammo] = atoi(arg);
break;
case CHEAT_CHANGE_MUSIC:
DE_Cheat(cheat_mus_seq,arg);
break;
case CHEAT_CHAINSAW:
DE_Cheat(cheat_choppers_seq,arg);
break;
case CHEAT_GOD_MODE:
DE_Cheat(cheat_god_seq,arg);
break;
case CHEAT_AMMO_KEYS:
DE_Cheat(cheat_ammonokey_seq,arg);
break;
case CHEAT_AMMO:
DE_Cheat(cheat_ammo_seq,arg);
break;
case CHEAT_NO_CLIPPING_1:
DE_Cheat(cheat_noclip_seq,arg);
break;
case CHEAT_NO_CLIPPING_2:
DE_Cheat(cheat_commercial_noclip_seq,arg);
break;
case CHEAT_INVINCIBILITY:
DE_Cheat(cheat_powerup_seq[0],arg);
break;
case CHEAT_BERSERK:
DE_Cheat(cheat_powerup_seq[1],arg);
break;
case CHEAT_INVISIBILITY:
DE_Cheat(cheat_powerup_seq[2],arg);
break;
case CHEAT_RADIATION_SUIT:
DE_Cheat(cheat_powerup_seq[3],arg);
break;
case CHEAT_AUTO_MAP:
DE_Cheat(cheat_powerup_seq[4],arg);
break;
case CHEAT_LITE_AMP_GOGGLES:
DE_Cheat(cheat_powerup_seq[5],arg);
break;
case CHEAT_BEHOLD_MENU:
DE_Cheat(cheat_powerup_seq[6],arg);
break;
case CHEAT_LEVEL_WARP:
DE_Cheat(cheat_clev_seq,arg);
break;
case CHEAT_PLAYER_POSITION:
DE_Cheat(cheat_mypos_seq,arg);
break;
case CHEAT_MAP_CHEAT:
DE_Cheat(cheat_amap_seq,arg);
break;
case MISC_INITIAL_HEALTH:
initial_health = atoi(arg);
break;
case MISC_INITIAL_BULLETS:
initial_bullets = atoi(arg);
break;
case MISC_MAX_HEALTH:
MAXHEALTH = atoi(arg);
break;
case MISC_MAX_ARMOR:
max_armor = atoi(arg);
break;
case MISC_GREEN_ARMOR_CLASS:
green_armor_class = atoi(arg);
break;
case MISC_BLUE_ARMOR_CLASS:
blue_armor_class = atoi(arg);
break;
case MISC_MAX_SOULSPHERE:
maxsoul = atoi(arg);
break;
case MISC_SOULSPHERE_HEALTH:
soul_health = atoi(arg);
break;
case MISC_MEGASPHERE_HEALTH:
mega_health = atoi(arg);
break;
case MISC_GOD_MODE_HEALTH:
god_health = atoi(arg);
break;
case MISC_IDFA_ARMOR:
idfa_armor = atoi(arg);
break;
case MISC_IDFA_ARMOR_CLASS:
idfa_armor_class = atoi(arg);
break;
case MISC_IDKFA_ARMOR:
idkfa_armor = atoi(arg);
break;
case MISC_IDKFA_ARMOR_CLASS:
idfa_armor_class = atoi(arg);
break;
case MISC_BFG_CELLS_SHOT:
BFGCELLS = atoi(arg);
break;
case SPRITE_OFFSET:
sprnames[sprite]=oldsprnames[(atoi(arg)-151328)/8];
case POINTER_CODEP_FRAME:
states[frame].action = actions[atoi(arg)];
default:
return(0);
}
return(1);
}
void
DE_AddDeh(char * name)
{
FILE *fp;
char text[255];
printf("DE_AddDeh: Adding %s\n", name);
if(fp = fopen(name,"r"))
{
int i;
/* Backup all action pointer */
for(i=0;i<NUMSTATES;i++)
actions[i] = states[i].action;
/* Backup all sprite name pointer */
for(i=0;i<NUMSPRITES;i++)
oldsprnames[i] = sprnames[i];
/* Start parsing the file */
while(fgets(text, 255, fp))
{
int len1 = 0, len2 = 0;
text[strlen(text)-1] = '\0';
if(text[0] == '#') continue;
if(text[0] == '\n') continue;
/* Check for text or hack */
if(sscanf(text, "Text %d %d", &len1, len2) == 2)
DE_Text(fp, len1, len2);
else
DE_Hack(text);
}
fclose(fp);
}
else
{
printf("Dehacked file '%s' not found\nPress ENTER to continue\n", name);
getchar();
}
}